package com.kongfuzi.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface ProductManager {
    int addProduct();//添加方法
    int deleteProduct(int no);//删除方法
}
//===========================
//要代理的业务对象, 不允许修改源代码
class ProductManagerImpl implements ProductManager {
    @Override
    public int addProduct() {
        System.out.println("执行添加商品");
        return 1;
    }
    @Override
    public int deleteProduct(int no) {
        System.out.println("执行删除商品..."+no);
        return 1001;
    }
}

//=============通过Proxy创建代理对象======================
//代理工厂类
class ProxyFactory {
    //被代理对象
    private Object target;
    //初始化代理对象
    public ProxyFactory(Object target) {
        this.target = target;
    }
    //获取代理对象
    public Object getProxy() {
        System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");
        Object  proxy = null;
        //调用处理器
        InvocationHandler h = new  MyLogInvocationHanler(target);
        //仅仅是创建代理对象,方法调用在哪里?
        proxy = Proxy.newProxyInstance(
                target.getClass().getClassLoader(), //被代理对象的类加载器
                target.getClass().getInterfaces(),  //被代理对象实现的接口
                h);                                 //调用处理器
        //返回代理对象
        return proxy;
    }

}
//============调用处理器 =============
class MyLogInvocationHanler implements InvocationHandler {
    //被代理的对象
    private Object object;
    //初始化被代理对象
    public MyLogInvocationHanler(Object object) {
        this.object = object;
    }

    /**
     * Object proxy 被代理对象
     * Method method 被调用的方法
     * Object[] args 被调用的方法的参数
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //获取调用方法名称
        String name = method.getName();
        before(name);//添加日志
        //调用真实对象的方法
        Object result = method.invoke(object, args);
        after(name);//添加日志
        return result;
    }

    public void before(String methodName) {
        System.out.println("开始执行"+methodName);
    }
    public void after(String methodName) {
        System.out.println("结束执行"+methodName);
    }
}
public class DynamicProxyDemo {

    public static void main(String[] args) {

        test2();
    }
    private static void test2() {
        //创建被代理对象
        ProductManager manager =new ProductManagerImpl();
        //把被代理对象传入代理工厂
        ProxyFactory factory = new ProxyFactory(manager);
        //获取代理对象
        ProductManager proxy = (ProductManager) factory.getProxy();
        //查看代理类的名称
        System.out.println("代理对象的名称:"+proxy.getClass().getName());
        //调用代理对象的方法
        proxy.addProduct();
        proxy.deleteProduct(10000);
    }
    //=============没有代理对象==============
    private static void test1() {
        ProductManager manager =new ProductManagerImpl();
        manager.addProduct();
        int result = manager.deleteProduct(1002);
        System.out.println("返回值:"+result);
    }
}
